collection_ref: add accessors for collection_id and ref_name
authorFelix Krull <f_krull@gmx.de>
Tue, 28 May 2019 20:57:21 +0000 (22:57 +0200)
committerColin Walters <walters@verbum.org>
Fri, 6 May 2022 16:53:54 +0000 (12:53 -0400)
rust-bindings/rust/src/collection_ref.rs [new file with mode: 0644]
rust-bindings/rust/src/lib.rs
rust-bindings/rust/tests/repo.rs

diff --git a/rust-bindings/rust/src/collection_ref.rs b/rust-bindings/rust/src/collection_ref.rs
new file mode 100644 (file)
index 0000000..428c0b5
--- /dev/null
@@ -0,0 +1,80 @@
+use glib::translate::ToGlibPtr;
+use std::ffi::CStr;
+use CollectionRef;
+
+trait AsNonnullPtr
+where
+    Self: Sized,
+{
+    fn as_nonnull_ptr(&self) -> Option<Self>;
+}
+
+impl<T> AsNonnullPtr for *mut T {
+    fn as_nonnull_ptr(&self) -> Option<Self> {
+        if self.is_null() {
+            None
+        } else {
+            Some(*self)
+        }
+    }
+}
+
+// TODO: these methods are unsound if you change the underlying OstreeCollectionRef from C. Is that
+//  a problem?
+impl CollectionRef {
+    /// Get the collection ID from this `CollectionRef`.
+    ///
+    /// # Returns
+    /// Since the value may not be valid UTF-8, `&CStr` is returned. You can safely turn it into a
+    /// `&str` using the `as_str` method.
+    ///
+    /// If no collection ID was set in the `CollectionRef`, `None` is returned.
+    pub fn collection_id(&self) -> Option<&CStr> {
+        let inner = self.to_glib_none();
+        unsafe {
+            (*inner.0)
+                .collection_id
+                .as_nonnull_ptr()
+                .map(|ptr| CStr::from_ptr(ptr))
+        }
+    }
+
+    /// Get the ref name from this `CollectionRef`.
+    ///
+    /// # Returns
+    /// Since the value may not be valid UTF-8, `&CStr` is returned. You can safely turn it into a
+    /// `&str` using the `as_str` method.
+    pub fn ref_name(&self) -> &CStr {
+        let inner = self.to_glib_none();
+        unsafe { CStr::from_ptr((*inner.0).ref_name) }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn should_get_collection_id() {
+        let collection_ref = CollectionRef::new(Some("collection.id"), "ref").unwrap();
+        let id = collection_ref.collection_id().unwrap().to_str().unwrap();
+
+        assert_eq!(id, "collection.id");
+    }
+
+    #[test]
+    fn should_get_none_collection_id() {
+        let collection_ref = CollectionRef::new(None, "ref").unwrap();
+        let id = collection_ref.collection_id();
+
+        assert_eq!(id, None);
+    }
+
+    #[test]
+    fn should_get_ref_name() {
+        let collection_ref = CollectionRef::new(Some("collection.id"), "ref-name").unwrap();
+        let ref_name = collection_ref.ref_name().to_str().unwrap();
+
+        assert_eq!(ref_name, "ref-name");
+    }
+}
index c4877cefbd37a611c94761e6fdb3e165d93264d1..973f0a158d97a9519357398a09c9af50d20c7d65 100644 (file)
@@ -29,8 +29,12 @@ pub use crate::auto::functions::*;
 pub use crate::auto::*;
 
 // handwritten code
+#[cfg(any(feature = "v2018_6", feature = "dox"))]
+mod collection_ref;
 mod object_name;
 mod repo;
+#[cfg(any(feature = "v2018_6", feature = "dox"))]
+pub use crate::collection_ref::*;
 pub use crate::object_name::*;
 pub use crate::repo::*;
 
index a4049ba063640ae7337d359af3c87371bd7160f8..7f8a7d119f63984c04bc0a32ba0d40313c6cadf9 100644 (file)
@@ -99,29 +99,3 @@ fn should_checkout_tree() {
     let testfile_contents = std::fs::read_to_string(testfile_path).expect("test file");
     assert_eq!("test\n", testfile_contents);
 }
-
-// TODO: figure this out and turn it back on
-#[test]
-#[ignore]
-fn should_error_safely_when_passing_empty_file_info_to_checkout_tree() {
-    let test_repo = TestRepo::new();
-    let _ = test_repo.test_commit("test");
-
-    let file = test_repo
-        .repo
-        .read_commit("test", NONE_CANCELLABLE)
-        .expect("read commit")
-        .0
-        .downcast::<ostree::RepoFile>()
-        .expect("RepoFile");
-    let result = test_repo.repo.checkout_tree(
-        ostree::RepoCheckoutMode::User,
-        ostree::RepoCheckoutOverwriteMode::None,
-        &gio::File::new_for_path("/"),
-        &file,
-        &gio::FileInfo::new(),
-        NONE_CANCELLABLE,
-    );
-
-    assert!(result.is_err());
-}